// CalculatorFactory
// 二元运算器工厂
// 根据用户提供的运算符号：+ - * /
// 实例化具体运算子类, 以父类类型 Calculator 返回
public class CalculatorFactory {
    // 测试函数
    public static void main(String[] args) {
        // 根据运算符号实例化 具体运算子类
        Calculator cal = CalculatorFactory.getCalculator("+");
        // 给属性赋值
        cal.numA = 12;
        cal.numB = 3;

        // 因为除法运算中有异常, 需要捕获处理
        try {
            System.out.println(cal.getResult());  // 获取运算结果, 由具体子类实现, 对应的其实是多态
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }

    }

    // 定义静态方法
    // 实例化具体运算子类, 以父类类型 Calculator 返回
    public static Calculator getCalculator(String op) {
        switch (op) {
        case "+":
            return new Add();
        case "-":
            return new Sub();
        case "*":
            return new Mul();
        case "/":
            return new Div();
        default:
            return null;  // 注意: 有可能引发空指针异常
        }
    }
}

// 运算父类
abstract class Calculator {
    public double numA;
    public double numB;

    public abstract double getResult() throws Exception;
}

// 加法子类
class Add extends Calculator {
    @Override
    public double getResult() {
        return numA + numB;
    }
}

// 减法子类
class Sub extends Calculator {
    @Override
    public double getResult() {
        return numA - numB;
    }
}

// 乘法子类
class Mul extends Calculator {
    @Override
    public double getResult() {
        return numA * numB;
    }
}

// 除法子类
class Div extends Calculator {
    @Override
    public double getResult() throws Exception {
        if (numB != 0) {
            return numA / numB;
        } else {
            throw new Exception("除数不能为0");
        }
    }
}